import util from '../common/util';

import {IView} from '../types/IView';
import {IAttr} from '../types/IAttr';
import {IAttrVals} from '../types/IAttrVals';

abstract class AbsViewObject<V extends IView> {

  protected viewIndex: number = 1;

  /**
   * 这个父组件是否可以放置指定类型的子组件, 有些特殊的组件只能放特地类型的子组件需要实现这个方法
   * @param childViewType 要判断的子组件的类型
   * @return 如果可以接收这个子组件, 则返回true
   */
  accept(childViewType: string): boolean {
    return false;
  }

  /**
   * 如果子组件有些不能被删除的, 则可以实现这个方法来避免
   * @param childViewIndex 子组件的序号, 判断是否不能被删除
   * @return 如果指定序号的子组件不能删除, 则返回true
   */
  preventDeleteChild(childViewIndex: number): boolean {
    return false;
  }

  protected generateId(): string {
    return util.generateId();
  }

  protected createAttrVals(attrs: IAttr[] = []): IAttrVals {
    const attrVals: IAttrVals = {};
    attrs.forEach(attr => {
      attrVals[attr.name] = attr.defaultValGenerator ? attr.defaultValGenerator() : '';
    });

    this.viewIndex++;
    return attrVals;
  }

}

export default AbsViewObject;
